package com.bugman.business.impl;

import com.bugman.business.CommentService;
import com.bugman.dao.Dao;
import com.bugman.entity.Bug;
import com.bugman.entity.Comment;
import com.bugman.entity.User;
import com.bugman.exceptions.BadAuthorException;
import com.bugman.exceptions.CommentIsNotLastException;
import java.util.Date;
import java.util.List;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author Flashman
 */
@Stateless
public class CommentServiceBean extends BaseServiceBean implements CommentService {

    @EJB
    Dao dao;

    /**
     * Vytvoří komentář a uloží jej do databáze.
     *
     * @param comment   objekt komentáře, který vytváříme
     */
    @RolesAllowed({"User", "Developer", "Admin"})
    public void createComment(Comment comment) {
        comment.setCreationTime(new Date());
        dao.persist(comment);
    }

    /**
     * Smaže komentář z databáze, pokud uživatel, který se jej pokouší smazat
     * je jeho autorem a komentář je poslední v seznamu komentářů.
     *
     * @param comment   cílový komentář
     * @param user      uživatel, který se pokouší smazat komentář
     */
    public void deleteComment(Comment comment, User loggedUser) throws CommentIsNotLastException, BadAuthorException {
        if(!comment.getAuthor().equals(loggedUser)) throw new BadAuthorException();
        if(!dao.isCommentLast(comment)) throw new CommentIsNotLastException();
        dao.remove(comment);
    }

    /**
     * Vrátí posledních <b>count</b> komentářů
     *
     * @param count             počet posledních komentářů, které se mají vrátit
     * @return List<Comment>    seznam vrácených komentářů
     */
    public List<Comment> getLastComments(Integer count) {
        return dao.getLastComments(count);
    }

    /**
     * Vrátí posledních <b>count</b> komentářů k bugu.
     *
     * @param bug               bug, u kterého hledáme komentáře
     * @param count             počet posledních komentářů bugu, které se mají vrátit
     * @return List<Comment>    seznam vrácených komentářů
     */
    public List<Comment> getLastComments(Bug bug, Integer count) {
        return dao.getLastComments(bug, count);
    }
    /**
     * Vrátí počet napsaných komentářů k zadanému bugu.
     *
     * @param bug           bug jehož komentáře počítáme
     * @return Integer      počet komentářů k bugu
     */
    public Integer getCommentsCount(Bug bug) {
        return dao.getCommentsCount(bug);
    }
}